package com.woniuxy.aspect;


import com.woniuxy.entity.RbacManager;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;

/**
 * @Author: 马宇航
 * @Todo: 定义切面类！！！！！切面类中核心定义的是 通知！！！
 * @DateTime: 22/08/23/0023 10:55
 * @Component: 成都蜗牛学苑
 **/
//@Component
//@Aspect
public class AspectJavaAnnotation {
    /**
     * 配置内部 切入点表达式
     * ChangeLog : 1. 创建 (22/08/23/0023 15:14 [马宇航]);
     *
     * @return void
    */
    @Pointcut("execution(* com.woniuxy.service.impl.*.*(..))")
    private void myPointCut(){}
    @Pointcut("execution(* com.woniuxy.service.impl.*.findOne(..))")
    private void myAroundPointCut(){}
    /**
     * 前置通知定义
     * ChangeLog : 1. 创建 (22/08/23/0023 10:59 [马宇航]);
     * @param joinPoint  AOP中携带的方法，可以支持获取目标类和方法的参数
     * @return void
    */
    @Before("myPointCut()")
    public void myBefore(@NotNull JoinPoint joinPoint){
        System.out.println("前置通知：模拟事务的开启……");
        System.out.println("获取目标类："+joinPoint.getTarget());
        System.out.print("，被织入增强的目标方法是："+joinPoint.getSignature().getName());
        System.out.println("…………………………………………………………………………………………");
    }
    /**
     * 后置通知
     * ChangeLog : 1. 创建 (22/08/23/0023 11:48 [马宇航]);
     * @param joinPoint
     * @return void
    */
    @AfterReturning("myPointCut()")
    public void myAfterReturning(@NotNull JoinPoint joinPoint){
        System.out.println("后置通知：模拟事务的提交……");
        System.out.print("，被织入增强的目标方法是："+joinPoint.getSignature().getName());
        System.out.println("…………………………………………………………………………………………");

    }
    /**
     * 这个很刑，一般不用，可以修改入参和返回！
     * ChangeLog : 1. 创建 (22/08/23/0023 11:57 [马宇航]);
     * @param proceedingJoinPoint
     * @return java.lang.Object
    */
   public Object myAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
       System.out.println("环绕通知开启：");
       //可以获取入参
       Object[] args = proceedingJoinPoint.getArgs();
       args[0] = 1;
       //反射的执行方法invoke意思
       RbacManager rbacManager = (RbacManager) proceedingJoinPoint.proceed(args);
       rbacManager.setAccount("嘿嘿嘿，想要查数据……");
       System.out.println("环绕通知结束！");
       return rbacManager;
   }
   @AfterThrowing(value = "myPointCut()",throwing ="e" )
   public void myAfterThrowing(JoinPoint joinPoint,Throwable e){
       System.out.println("抛出异常："+e.getMessage());
   }
   @After("myPointCut()")
   public void myAfter(){
       System.out.println("最终通知的执行！");
   }
}
